<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //单例模式升级  

        // function Person(name){
        //     this.name = name;
        // }


        // let instance = null;
        // function singleten(username){
        //     if(instance==null){
        //         instance = new Person(username)
        //     }
        //     return instance
        // }

        // 私有化 
        // instance 延长生命周期 闭包 
        // 我想拿到 singleten 闭包  

        // function outer(){
        //     let instance = null;
        //     return function singleten(username){
        //         if(instance==null){
        //             instance = new Person(username)
                    
        //         }
        //         return instance
        //     }
        // }


        // const p1 = outer(); 
        // // p1得到 singleten 这个函数  
         
        // console.log(p1('张三'),p1('李四'));


        // outer 这个函数 只是在 const p1 = outer(); 用了一次 
        // 用自执行函数 代替  

        // 打开页面自动执行  
        // const res = (function(){
        //     let instance = null;
        //     return function singleten(username){
        //         if(instance==null){
        //             instance = new Person(username)
                    
        //         }
        //         return instance
        //     }
        // })()

        // console.log(res('张三'),res('孙洪康'));


        // Person 构造函数  这个类 在外边  
        // 完全可以 避开上面的自执行函数  自己去实例化 
        // 那么单例模式就没有任何意义了  

        // 如何解决  

        // 把Person 放到内部即可  


        // const Person = (function(){

            
        //     function Person(name){
        //         this.name = name;
        //     }
        //     let instance = null;
        //     return function singleten(username){
        //         if(instance==null){
        //             instance = new Person(username)
                    
        //         }
        //         return instance
        //     }
        // })();



        // 能不能把res 也换成Person 
        // Person()


        // singleten函数内的Person访问的是谁  构造函数 
        // 全局的Person 又是谁  得到的是 singleten函数


        // console.log(Person('张三'),Person('李四'))



        // const Person = (function(){
        //     // 构造函数本身 
        //     class Person{
        //         constructor(){
        //             // 这段代码也执行 一次 
        //             this.name = 'haha';
        //             this.age = 0;
        //             this.init()
        //         }

        //         // 如何想让方法只执行一次  只需要将方法放到 constructor中 
        //         init(){

        //         }

        //         // 只要实例化对象 就会执行一次的 

        //         setName(name){
        //             this.name = name;
        //         }

        //         setAge(age){
        //             this.age = age
        //         }


        //     }

        //     // 单例核心代码 

        //     let instance = null;
        //     return function singleten(name,age){
        //         if(instance == null){
        //             instance = new Person(); // 这一行只执行一次
        //         }

        //         // 这个代码 只要你创建对象 就会执行一次 
        //         instance.setName(name)
        //         instance.setAge(age)
                
        //         return instance
        //     }
        // })()

        // const p1 = Person('张三',18);
        // //new Person 执行了一次  setName('张三') setAge(18) 各1次 
        // console.log(p1); // 张三  18 
        // const p2 = Person('李四',19);
        // //new Person 执行了0次  setName('李四') setAge(19) 各1次 
        // console.log(p2); // 李四 19

        // const p3 = Person('福祥',20);
        // //new Person 执行了0次  setName('福祥') setAge(20) 各1次 
        // console.log(p2); // 福祥 20



    const Person = (function(){
        // 构造函数代码  
        class Person{
            constructor(){
                this.title = '';
                this.init()
            }
            //让这个方法只执行一次
            init(){
                this.createDiv();
            }


            // 只要你实例化对象 这个方法就会执行 
            every(text,color){
                this.setTitle(text)
                this.setBgcolor(color)

            }

            createDiv(){
                console.log('---------------------');
                console.log('创建div');
                console.log('设置div的样式');
                console.log('设置位置');
                console.log('插入到body中')
                console.log('---------------------');

            }

            setTitle(text){
                this.title = text;
                console.log('修改div的文本内容');
            }

            setBgcolor(color){
                console.log('修改div的背景颜色修改成',color);
            }
        }



        // 单例模式核心代码 
        let instance = null;

        return function singleten(...args){
            if(instance == null){
                instance = new Person(); // 这行代码只执行一次
            }
            
            instance.every(...args)
            return instance
        }
    })();


    const p1 = Person('我想把文本修改成张三','red')
    const p2 = Person('我想把文本修改成李四','green')

    console.log(p1,p2);
    </script>
</body>
</html>